package com.example.app

import android.util.Log
import com.example.app.entity.User
import com.example.core.utils.dp2px

val user = User("AA", "BB", "CC")
val userCopy = user.copy()

//Kotlin可以直接把函数声明在文件中，而并不是一定要声明一个类
//java的void=kotlin :Unit并且可以省略
fun main() {
    print("Hello World")
    //后面的返回类型是可以省略的，因为类型推导机制
    var age: Int = 18
    val name: String = "Kotlin"
    //val关键字声明的属性不可更改
//    name="Android"
    age = 18
    var java = Java()
    2f.dp2px()

    //是否相等
    println(user)
    println(userCopy)
    //在java中，==表示比较的是地址
    //在kotlin中，==表示equals函数。因为kotlin把这些细节隐藏了，害，这也是太简洁不好的地方
    //使用tools-->kotlin-->show kotlin bytecode我们可以看见相应的java代码
    println(user == user)
    println(Any() == user)

    println(user === user)
    //实际上上面这个函数，是一个接受两个参数的方法，但是第二个参数是个lambda表达式
    //repeat函数被一个inline关键字修饰，标明他是一个内联函数
    repeat(100) {
        println(it)
    }

    val array = arrayOf(1, 2, 356, 447)
    //until， infix关键字修饰的函数
    for (i in 0 until array.size) {

    }
    //array.indices会直接返回一个区间
    for (i in array.indices) {

    }

    //内联函数，相当于直接把函数内容插在了当前位置。将函数体插入到了当前位置Log.e("Tag","我爱你")
    log("我爱你")
}
//Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types
//内联的预期性能影响微不足道。内联最适合当传入的参数类型为函数类型时。
//那么什么是函数类型的参数？
inline  fun log(text:String){
    Log.e("Tag",text)
}


fun doubleNumber(x: Int): Int {
    return x * 2
}